#pragma once
#include<stdio.h>
#include"events.h"
// #include"nature.h"
// #include"creature2.h"

class Nature;
extern Nature nature;
/*生物类，作为狼、羊、草三种生物的基类
* 内含生物的基本信息和行为函数，如姓名（编号）、年龄、性别、生命值、饥饿值、位置信息、生存状态
* 生物对象的生命周期为：被new生成，通过构造函数Creature()随机设定基本数值，然后随回合执行动作action()，最后死亡，死亡后被析构
* 生物在每回合的行为模式是：首先计算身体状况situation()，根据身体状况确定行为模式（m_flag.mode）是觅食（1）还是求偶（2）
然后根据这点搜索search()不同种类生物，如果有则以该生物为对象做出动作（移动过去或移动远离），如果没有则随机移动
*/

struct Flag
{
	int race = 0;/*生物的种族，1为狼2为羊3为草*/
	int gender = 0;/*性别标签，1为雄，2为雌，3为无性别*/
	int live = 1;/*生存状态，1为生存，2为死亡*/
	int dead = 0;/*死因，1为老死，2为重伤*/
	int mode = 0;/*行为模式，1为捕猎，2为求偶，3为逃避，0为闲逛*/
	int age_up = 0;/*年龄上限,超过该上限则老死*/
	int hp_up = 0;/*生命值上限，即标明满血有多少*/
	int hunger_full = 0;/*饥饿值超过此值意味着生物不处于饥饿状态，可以执行觅食以外的动作*/
	int can_eat = 1;/*能不能吃，先默认为1，之后可以添加状态判断*/
};

struct Target
{
	int* num ;/*目标种族的总数，用来作为终点*/
	int contact = 0;/*有没有与目标接触*/
	int distance_x = 1;/*确定x轴正反方向*/
	int distance_y = 1;/*确定y轴正反方向*/
	int k = 0;/*确定x和y的比例，即斜率*/
	int distance = 9999;/*与目标生物之间的距离，先拉大*/
	Creature** race = nullptr;/*目标生物种族数组*/
	Creature* self = nullptr;/*目标生物对象*/
};

struct Position;

class Creature
{
public:

	Target m_target;
	Flag m_flag;
	int m_name = 0;
	int m_age = 0;
	int m_hp = 0;
	int m_hunger = 0;
	Position m_position;
	int m_sight = 20;/*视野范围*/
	int m_step = 10;/*最大移动距离*/

	Creature();
	Creature(int name);
	Creature(int name,int x, int y, Flag flag);
	~Creature();

	virtual void action();
	virtual int situation();/*状况结算,返回行动模式*/
	void search();/*搜索*/
	virtual void choose_target_race(int mode);/*根据flag.mode改变行动模式*/
	void judge(Creature& c);/*放在search内，判断生物的属性*/
	void get_distance(Creature& c);/*计算两者的距离*/
	void move_to(Creature& c);/*向某个对象移动*/
	void move_out(Creature& c);/*远离某个对象*/
	void move_to();/*随机移动*/
	virtual void eat(Creature& c);/*捕食*/
	virtual void breed();/*繁衍*/

	/*记录事件有多种格式，即可按照输入格式不同生成不同预设的事件
	* 记录一定会需要的：时间地点、人物（name和物种flag）、事件（通过flag.mode）、事件对象（target）、造成的影响（暂时没有，后补）
	* 现在是事件有三类，即捕食、繁衍和死亡，前两类传递flag.mode，死亡传递flag.live
	*/
	void record();/*记录事件，生成一个对象并填入相关变量，可以通过填入的变量数量不同进行多态，需要明确依赖关系*/
	virtual void record(Creature& c);
	void record(Creature& c, int name);
};
/*狼，移动速度和搜索范围均强于羊，移动到羊的位置即捕猎完成可以吃掉羊,后续考虑加入战斗规则*/
// class Wolf :public Creature;

/*羊，吃草，躲避狼*/
// class Sheep :public Creature;

/*草，性别flag全部是2，行动模式只有生长和繁殖*/
// class Grass :public Creature;
